<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>t051treeRewriteAST</title>

<!-- ANTLR includes -->
<script type="text/javascript" src="../../lib/antlr3-all.js"></script>
<script type="text/javascript" src="t051treeRewriteASTaLexer.js"></script>
<script type="text/javascript" src="t051treeRewriteASTaParser.js"></script>
<script type="text/javascript" src="t051treeRewriteASTaWalker.js"></script>
<script type="text/javascript" src="t051treeRewriteASTbLexer.js"></script>
<script type="text/javascript" src="t051treeRewriteASTbParser.js"></script>
<script type="text/javascript" src="t051treeRewriteASTbWalker.js"></script>
<script type="text/javascript" src="t051treeRewriteASTcLexer.js"></script>
<script type="text/javascript" src="t051treeRewriteASTcParser.js"></script>
<script type="text/javascript" src="t051treeRewriteASTcWalker.js"></script>
<script type="text/javascript" src="t051treeRewriteASTdLexer.js"></script>
<script type="text/javascript" src="t051treeRewriteASTdParser.js"></script>
<script type="text/javascript" src="t051treeRewriteASTdWalker.js"></script>
<script type="text/javascript" src="t051treeRewriteASTeLexer.js"></script>
<script type="text/javascript" src="t051treeRewriteASTeParser.js"></script>
<script type="text/javascript" src="t051treeRewriteASTeWalker.js"></script>
<script type="text/javascript" src="t051treeRewriteASTfLexer.js"></script>
<script type="text/javascript" src="t051treeRewriteASTfParser.js"></script>
<script type="text/javascript" src="t051treeRewriteASTfWalker.js"></script>
<script type="text/javascript" src="t051treeRewriteASTgLexer.js"></script>
<script type="text/javascript" src="t051treeRewriteASTgParser.js"></script>
<script type="text/javascript" src="t051treeRewriteASTgWalker.js"></script>
<script type="text/javascript" src="t051treeRewriteASThLexer.js"></script>
<script type="text/javascript" src="t051treeRewriteASThParser.js"></script>
<script type="text/javascript" src="t051treeRewriteASThWalker.js"></script>
<script type="text/javascript" src="t051treeRewriteASTiLexer.js"></script>
<script type="text/javascript" src="t051treeRewriteASTiParser.js"></script>
<script type="text/javascript" src="t051treeRewriteASTiWalker.js"></script>
<script type="text/javascript" src="t051treeRewriteASTjLexer.js"></script>
<script type="text/javascript" src="t051treeRewriteASTjParser.js"></script>
<script type="text/javascript" src="t051treeRewriteASTjWalker.js"></script>
<script type="text/javascript" src="t051treeRewriteASTkLexer.js"></script>
<script type="text/javascript" src="t051treeRewriteASTkParser.js"></script>
<script type="text/javascript" src="t051treeRewriteASTkWalker.js"></script>
<script type="text/javascript" src="t051treeRewriteASTlLexer.js"></script>
<script type="text/javascript" src="t051treeRewriteASTlParser.js"></script>
<script type="text/javascript" src="t051treeRewriteASTlWalker.js"></script>
<script type="text/javascript" src="t051treeRewriteASTmLexer.js"></script>
<script type="text/javascript" src="t051treeRewriteASTmParser.js"></script>
<script type="text/javascript" src="t051treeRewriteASTmWalker.js"></script>
<script type="text/javascript" src="t051treeRewriteASTnLexer.js"></script>
<script type="text/javascript" src="t051treeRewriteASTnParser.js"></script>
<script type="text/javascript" src="t051treeRewriteASTnWalker.js"></script>
<script type="text/javascript" src="t051treeRewriteASToLexer.js"></script>
<script type="text/javascript" src="t051treeRewriteASToParser.js"></script>
<script type="text/javascript" src="t051treeRewriteASToWalker.js"></script>
<script type="text/javascript" src="t051treeRewriteASTpLexer.js"></script>
<script type="text/javascript" src="t051treeRewriteASTpParser.js"></script>
<script type="text/javascript" src="t051treeRewriteASTpWalker.js"></script>
<script type="text/javascript" src="t051treeRewriteASTqLexer.js"></script>
<script type="text/javascript" src="t051treeRewriteASTqParser.js"></script>
<script type="text/javascript" src="t051treeRewriteASTqWalker.js"></script>
<script type="text/javascript" src="t051treeRewriteASTrLexer.js"></script>
<script type="text/javascript" src="t051treeRewriteASTrParser.js"></script>
<script type="text/javascript" src="t051treeRewriteASTrWalker.js"></script>
<script type="text/javascript" src="t051treeRewriteASTsLexer.js"></script>
<script type="text/javascript" src="t051treeRewriteASTsParser.js"></script>
<script type="text/javascript" src="t051treeRewriteASTsWalker.js"></script>
<script type="text/javascript" src="t051treeRewriteASTtLexer.js"></script>
<script type="text/javascript" src="t051treeRewriteASTtParser.js"></script>
<script type="text/javascript" src="t051treeRewriteASTtWalker.js"></script>
<script type="text/javascript" src="t051treeRewriteASTuLexer.js"></script>
<script type="text/javascript" src="t051treeRewriteASTuParser.js"></script>
<script type="text/javascript" src="t051treeRewriteASTuWalker.js"></script>
<script type="text/javascript" src="t051treeRewriteASTvLexer.js"></script>
<script type="text/javascript" src="t051treeRewriteASTvParser.js"></script>
<script type="text/javascript" src="t051treeRewriteASTvWalker.js"></script>
<script type="text/javascript" src="t051treeRewriteASTwLexer.js"></script>
<script type="text/javascript" src="t051treeRewriteASTwParser.js"></script>
<script type="text/javascript" src="t051treeRewriteASTwWalker.js"></script>
<script type="text/javascript" src="t051treeRewriteASTxLexer.js"></script>
<script type="text/javascript" src="t051treeRewriteASTxParser.js"></script>
<script type="text/javascript" src="t051treeRewriteASTxWalker.js"></script>
<script type="text/javascript" src="t051treeRewriteASTyLexer.js"></script>
<script type="text/javascript" src="t051treeRewriteASTyParser.js"></script>
<script type="text/javascript" src="t051treeRewriteASTyWalker.js"></script>
<script type="text/javascript" src="t051treeRewriteASTzLexer.js"></script>
<script type="text/javascript" src="t051treeRewriteASTzParser.js"></script>
<script type="text/javascript" src="t051treeRewriteASTzWalker.js"></script>
<script type="text/javascript" src="t051treeRewriteASTaaLexer.js"></script>
<script type="text/javascript" src="t051treeRewriteASTaaParser.js"></script>
<script type="text/javascript" src="t051treeRewriteASTaaWalker.js"></script>
<script type="text/javascript" src="t051treeRewriteASTabLexer.js"></script>
<script type="text/javascript" src="t051treeRewriteASTabParser.js"></script>
<script type="text/javascript" src="t051treeRewriteASTabWalker.js"></script>
<script type="text/javascript" src="t051treeRewriteASTacLexer.js"></script>
<script type="text/javascript" src="t051treeRewriteASTacParser.js"></script>
<script type="text/javascript" src="t051treeRewriteASTacWalker.js"></script>

<!-- JsUnit include -->
<script type="text/javascript" src="../jsunit/app/jsUnitCore.js"></script>

<!-- Test Code -->
<script type="text/javascript">
    function execTreeParser(lexerCls, parserCls, grammarEntry, walkerCls, treeEntry, xinput)
    {
        var cstream = new org.antlr.runtime.ANTLRStringStream(xinput),
            lexer = new lexerCls(cstream),
            tstream = new org.antlr.runtime.CommonTokenStream(lexer),
            parser = new parserCls(tstream);
        var r = parser[grammarEntry]();

        var nodes = new org.antlr.runtime.tree.CommonTreeNodeStream(r.getTree());
        nodes.setTokenStream(tstream);
        var walker = new (walkerClass(walkerCls))(nodes);
        var w = walker[treeEntry]();

        if (w.tree) {
            return w.tree.toStringTree();
        }
        return "";
    }

    function walkerClass(base) {
        var TWalker = function() {
            TWalker.superclass.constructor.apply(this, arguments);
            this.traces = [];
            this.buf = "";
        };

        org.antlr.lang.extend(TWalker, base, {
            traceIn: function(ruleName, ruleIndex) {
                this.traces.push(">"+ruleName);
            },
            traceOut: function(ruleName, ruleIndex) {
                this.traces.push("<"+ruleName);
            },
            reportError: function(input, re) {
                throw re;
            }
        });

        return TWalker;
    }

    function testFlatList() {
        var found = execTreeParser(t051treeRewriteASTaLexer,
                t051treeRewriteASTaParser,
                "a",
                t051treeRewriteASTaWalker,
                "a",
                "abc 34");
        assertEquals(found, "34 abc");
    }

    function testSimpleTree() {
        var found = execTreeParser(t051treeRewriteASTbLexer,
                t051treeRewriteASTbParser,
                "a",
                t051treeRewriteASTbWalker,
                "a",
                "abc 34");
        assertEquals(found, "(34 abc)");
    }

    function testCombinedRewriteAndAuto() {
        var found = execTreeParser(t051treeRewriteASTcLexer,
                t051treeRewriteASTcParser,
                "a",
                t051treeRewriteASTcWalker,
                "a",
                "abc 34");
        assertEquals(found, "(34 abc)");

        found = execTreeParser(t051treeRewriteASTcLexer,
                t051treeRewriteASTcParser,
                "a",
                t051treeRewriteASTcWalker,
                "a",
                "34");
        assertEquals(found, "34");
    }

    function testAvoidDup() {
        var found = execTreeParser(t051treeRewriteASTdLexer,
                t051treeRewriteASTdParser,
                "a",
                t051treeRewriteASTdWalker,
                "a",
                "abc");
        assertEquals(found, "(abc abc)");
    }

    function testLoop() {
        var found = execTreeParser(t051treeRewriteASTeLexer,
                t051treeRewriteASTeParser,
                "a",
                t051treeRewriteASTeWalker,
                "a",
                "a b c 3 4 5");
        assertEquals(found, "3 4 5 a b c");
    }

    function testAutoDup() {
        var found = execTreeParser(t051treeRewriteASTfLexer,
                t051treeRewriteASTfParser,
                "a",
                t051treeRewriteASTfWalker,
                "a",
                "abc");
        assertEquals(found, "abc");
    }

    function testAutoDupRule() {
        var found = execTreeParser(t051treeRewriteASTgLexer,
                t051treeRewriteASTgParser,
                "a",
                t051treeRewriteASTgWalker,
                "a",
                "a 1");
        assertEquals(found, "a 1");
    }

    function testAutoDupMultiple() {
        var found = execTreeParser(t051treeRewriteASThLexer,
                t051treeRewriteASThParser,
                "a",
                t051treeRewriteASThWalker,
                "a",
                "a b 3");
        assertEquals(found, "a b 3");
    }

    function testAutoDupTree() {
        var found = execTreeParser(t051treeRewriteASTiLexer,
                t051treeRewriteASTiParser,
                "a",
                t051treeRewriteASTiWalker,
                "a",
                "a 3");
        assertEquals(found, "(a 3)");
    }

    function testAutoDupTreeWithLabels() {
        var found = execTreeParser(t051treeRewriteASTjLexer,
                t051treeRewriteASTjParser,
                "a",
                t051treeRewriteASTjWalker,
                "a",
                "a 3");
        assertEquals(found, "(a 3)");
    }

    function testAutoDupTreeWithListLabels() {
        var found = execTreeParser(t051treeRewriteASTkLexer,
                t051treeRewriteASTkParser,
                "a",
                t051treeRewriteASTkWalker,
                "a",
                "a 3");
        assertEquals(found, "(a 3)");
    }

    function testAutoDupTreeWithRuleRoot() {
        var found = execTreeParser(t051treeRewriteASTlLexer,
                t051treeRewriteASTlParser,
                "a",
                t051treeRewriteASTlWalker,
                "a",
                "a 3");
        assertEquals(found, "(a 3)");
    }

    function testAutoDupTreeWithRuleRootAndLabels() {
        var found = execTreeParser(t051treeRewriteASTmLexer,
                t051treeRewriteASTmParser,
                "a",
                t051treeRewriteASTmWalker,
                "a",
                "a 3");
        assertEquals(found, "(a 3)");
    }

    function testAutoDupTreeWithRuleRootAndListLabels() {
        var found = execTreeParser(t051treeRewriteASTnLexer,
                t051treeRewriteASTnParser,
                "a",
                t051treeRewriteASTnWalker,
                "a",
                "a 3");
        assertEquals(found, "(a 3)");
    }

    function testAutoDupNestedTree() {
        var found = execTreeParser(t051treeRewriteASToLexer,
                t051treeRewriteASToParser,
                "a",
                t051treeRewriteASToWalker,
                "a",
                "a b 3");
        assertEquals(found, "(a (b 3))");
    }

    function testDelete() {
        var found = execTreeParser(t051treeRewriteASTpLexer,
                t051treeRewriteASTpParser,
                "a",
                t051treeRewriteASTpWalker,
                "a",
                "abc");
        assertEquals(found, "");
    }

    function testSetMatchNoRewrite() {
        var found = execTreeParser(t051treeRewriteASTqLexer,
                t051treeRewriteASTqParser,
                "a",
                t051treeRewriteASTqWalker,
                "a",
                "abc 34");
        assertEquals(found, "abc 34");
    }

    function testSetMatchNoRewriteLevel2() {
        var found = execTreeParser(t051treeRewriteASTrLexer,
                t051treeRewriteASTrParser,
                "a",
                t051treeRewriteASTrWalker,
                "a",
                "abc 34");
        assertEquals(found, "(abc 34)");
    }

    function testSetMatchNoRewriteLevel2Root() {
        var found = execTreeParser(t051treeRewriteASTsLexer,
                t051treeRewriteASTsParser,
                "a",
                t051treeRewriteASTsWalker,
                "a",
                "abc 34");
        assertEquals(found, "(abc 34)");
    }

    function testRewriteModeCombinedRewriteAndAuto() {
        var found = execTreeParser(t051treeRewriteASTtLexer,
                t051treeRewriteASTtParser,
                "a",
                t051treeRewriteASTtWalker,
                "a",
                "abc 34");
        assertEquals(found, "(ick 34)");

        found = execTreeParser(t051treeRewriteASTtLexer,
                t051treeRewriteASTtParser,
                "a",
                t051treeRewriteASTtWalker,
                "a",
                "34");
        assertEquals(found, "34");
    }

    function testRewriteModeFlatTree() {
        var found = execTreeParser(t051treeRewriteASTuLexer,
                t051treeRewriteASTuParser,
                "a",
                t051treeRewriteASTuWalker,
                "s",
                "abc 34");
        assertEquals(found, "abc 1");
    }

    function testRewriteModeChainRuleFlatTree() {
        var found = execTreeParser(t051treeRewriteASTvLexer,
                t051treeRewriteASTvParser,
                "a",
                t051treeRewriteASTvWalker,
                "s",
                "abc 34");
        assertEquals(found, "34 abc");
    }

    function testRewriteModeChainRuleTree() {
        var found = execTreeParser(t051treeRewriteASTwLexer,
                t051treeRewriteASTwParser,
                "a",
                t051treeRewriteASTwWalker,
                "s",
                "abc 34");
        assertEquals(found, "34");
    }

    function testRewriteModeChainRuleTree2() {
        var found = execTreeParser(t051treeRewriteASTxLexer,
                t051treeRewriteASTxParser,
                "a",
                t051treeRewriteASTxWalker,
                "s",
                "abc 34");
        assertEquals(found, "34");
    }

    function testRewriteModeChainRuleTree3() {
        var found = execTreeParser(t051treeRewriteASTyLexer,
                t051treeRewriteASTyParser,
                "a",
                t051treeRewriteASTyWalker,
                "s",
                "boo abc 34");
        assertEquals(found, "boo 34");
    }

    function testRewriteModeChainRuleTree4() {
        var found = execTreeParser(t051treeRewriteASTzLexer,
                t051treeRewriteASTzParser,
                "a",
                t051treeRewriteASTzWalker,
                "s",
                "boo abc 34");
        assertEquals(found, "(boo 34)");
    }

    function testRewriteModeChainRuleTree5() {
        var found = execTreeParser(t051treeRewriteASTaaLexer,
                t051treeRewriteASTaaParser,
                "a",
                t051treeRewriteASTaaWalker,
                "s",
                "boo abc 34");
        assertEquals(found, "(boo 34)");
    }

    function testRewriteModeWithPredicatedRewrites() {
        var found = execTreeParser(t051treeRewriteASTabLexer,
                t051treeRewriteASTabParser,
                "a",
                t051treeRewriteASTabWalker,
                "s",
                "abc 34");
        assertEquals(found, "(root (ick 34))");
    }

    function testWildcard() {
        var found = execTreeParser(t051treeRewriteASTacLexer,
                t051treeRewriteASTacParser,
                "a",
                t051treeRewriteASTacWalker,
                "s",
                "abc 34");
        assertEquals(found, "34");
    }
</script>

</head>
<body>
    <h1>t051treeRewriteAST</h1>
</body>
</html>
